﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace ProjektConsole
{
    public class Mock
    {
        public static Sustav generirajSustav()
        {
            Sustav sustav = new Sustav();
            Mreza mreza = new Mreza();
            sustav.Mreza = mreza;
            mreza.Cvorovi = new List<Cvor>();
            mreza.Rute = new List<Ruta>();


            mreza.Cvorovi.Add(new Cvor() { Lokacija = new Point(0, 0), Naziv = 1 });
            mreza.Cvorovi.Add(new Cvor() { Lokacija = new Point(100, 0), Naziv = 2 });
            mreza.Cvorovi.Add(new Cvor() { Lokacija = new Point(200, 0), Naziv = 3 });
            mreza.Cvorovi.Add(new Cvor() { Lokacija = new Point(0, 100), Naziv = 4 });
            mreza.Cvorovi.Add(new Cvor() { Lokacija = new Point(100, 100), Naziv = 5 });
            mreza.Cvorovi.Add(new Cvor() { Lokacija = new Point(200, 100), Naziv = 6 });

            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[0], Kraj = mreza.Cvorovi[3] });
            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[0], Kraj = mreza.Cvorovi[1] });
            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[0], Kraj = mreza.Cvorovi[4] });
            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[1], Kraj = mreza.Cvorovi[1] });
            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[1], Kraj = mreza.Cvorovi[4] });
            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[1], Kraj = mreza.Cvorovi[5] });
            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[2], Kraj = mreza.Cvorovi[5] });
            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[3], Kraj = mreza.Cvorovi[4] });
            mreza.Rute.Add(new Ruta() { Pocetak = mreza.Cvorovi[4], Kraj = mreza.Cvorovi[5] });

            List<Zahtjev> z = new List<Zahtjev>();
            sustav.Zahtjevi = z;
            z.Add(new Zahtjev() { Pocetak = mreza.Cvorovi[0], Kraj = mreza.Cvorovi[5] });
            z.Add(new Zahtjev() { Pocetak = mreza.Cvorovi[2], Kraj = mreza.Cvorovi[3] });
            z.Add(new Zahtjev() { Pocetak = mreza.Cvorovi[1], Kraj = mreza.Cvorovi[5] });
            z.Add(new Zahtjev() { Pocetak = mreza.Cvorovi[3], Kraj = mreza.Cvorovi[1] });
            z.Add(new Zahtjev() { Pocetak = mreza.Cvorovi[5], Kraj = mreza.Cvorovi[4] });


            //za 1. zahtjev k.najkraćih:
            List<Put> kn = new List<Put>();
            z[0].KNajkracih = kn;
            DodajNajbliziPut(mreza, ref kn, 0, 4, 5, 0);
            DodajNajbliziPut(mreza, ref kn, 0, 1, 2, 5, 1);
            DodajNajbliziPut(mreza, ref kn, 0, 3, 4, 5, 2);

            //za 2. zahtjev k.najkraćih:
            kn = new List<Put>();
            z[1].KNajkracih = kn;
            DodajNajbliziPut(mreza, ref kn, 2, 5, 4, 3, 0);
            DodajNajbliziPut(mreza, ref kn, 2, 1, 0, 3, 1);
            DodajNajbliziPut(mreza, ref kn, 2, 1, 4, 3, 2);

            //za 3. zahtjev k.najkraćih:
            kn = new List<Put>();
            z[2].KNajkracih = kn;
            DodajNajbliziPut(mreza, ref kn, 1, 5, 0);
            DodajNajbliziPut(mreza, ref kn, 1, 2, 5, 1);
            DodajNajbliziPut(mreza, ref kn, 1, 4, 5, 2);

            //za 4. zahtjev k.najkraćih:
            kn = new List<Put>();
            z[3].KNajkracih = kn;
            DodajNajbliziPut(mreza, ref kn, 3, 0, 1, 0);
            DodajNajbliziPut(mreza, ref kn, 3, 4, 1, 1);
            DodajNajbliziPut(mreza, ref kn, 3, 4, 5, 1, 2);

            //za 5. zahtjev k.najkraćih:
            kn = new List<Put>();
            z[4].KNajkracih = kn;
            DodajNajbliziPut(mreza, ref kn, 5, 4, 0);
            DodajNajbliziPut(mreza, ref kn, 5, 1, 4, 1);
            DodajNajbliziPut(mreza, ref kn, 5, 2, 1, 4, 2);

            return sustav;
        }

        private static void DodajNajbliziPut(Mreza mreza, ref List<Put> kn,
            int iCvora1, int iCvora2, int iCvora3, int iCvora4, int valnaDuljina)
        {
            var p = new Put() { Cvorovi = new List<Cvor>() };
            p.Cvorovi.Add(mreza.Cvorovi[iCvora1]);
            p.Cvorovi.Add(mreza.Cvorovi[iCvora2]);
            p.Cvorovi.Add(mreza.Cvorovi[iCvora3]);
            p.Cvorovi.Add(mreza.Cvorovi[iCvora4]);
            p.ValnaDuljina = 0;
            kn.Add(p);
        }

        private static void DodajNajbliziPut(Mreza mreza, ref List<Put> kn,
           int iCvora1, int iCvora2, int iCvora3, int valnaDuljina)
        {
            var p = new Put() { Cvorovi = new List<Cvor>() };
            p.Cvorovi.Add(mreza.Cvorovi[iCvora1]);
            p.Cvorovi.Add(mreza.Cvorovi[iCvora2]);
            p.Cvorovi.Add(mreza.Cvorovi[iCvora3]);
            p.ValnaDuljina = 0;
            kn.Add(p);
        }

        private static void DodajNajbliziPut(Mreza mreza, ref List<Put> kn,
          int iCvora1, int iCvora2, int valnaDuljina)
        {
            var p = new Put() { Cvorovi = new List<Cvor>() };
            p.Cvorovi.Add(mreza.Cvorovi[iCvora1]);
            p.Cvorovi.Add(mreza.Cvorovi[iCvora2]);
            p.ValnaDuljina = 0;
            kn.Add(p);
        }

    }
}
